// 返回never的函数必须存在无法到达的终点
function err(message: string): never {
  //因为必定抛出异常，所以err将不会有返回值
  throw new Error(message)
}
//因为存在死循环 所以loop将不会存在返回值
function loop(): never {
  while (true) {

  }
}
//never与void的差别
// void 只是本身没有返回值 但是不会报错 
function a(): void {
  console.log('aaa');
}
//never 只会抛出异常，但是不会有返回值
function error(): never {
  throw new Error('aaa')
}

//never的应用场景
// interface A {
//   type: 'foo'
// }
// interface B {
//   type: 'bar'
// }
// type All = A | B
// function handleValue(val: All) {
//   switch (val.type) {
//     case 'bar':
//       break
//     case 'foo':
//       break
//     default:
//       //兜底逻辑 一般是不会进入这儿的，如果进来了，就说明程序的逻辑肯定出现了问题
//       const err: never = val;
//       break
//   }
// }
interface A {
  type: 'foo'
}
interface B {
  type: 'bar'
}
interface C {
  type: 'bizz'
}
type All = A | B | C
function handleValue(val: All) {
  switch (val.type) {
    case 'bar':
      break
    case 'foo':
      break
    case 'bizz':
      break
    default:
      //兜底逻辑 一般是不会进入这儿的，如果进来了，就说明程序的逻辑肯定出现了问题
      const err: never = val;
      break
  }
}

//由于任何类型都不能赋值给 never 类型的变量，所以当存在进入 default 分支的可能性时，TS的类型检查会及时帮我们发现这个问题
